// const symbol1 = Symbol('mySymbol');
// const symbol2 = Symbol('mySymbol');
// console.log(symbol1 === symbol2); // 输出: false
// console.log(symbol1.description);

const myObject = Symbol();
let a = {};
// Object.defineProperty(a, myObject, {
//     value: 'hello world'
// });
//通过object的defineProperty来设置属性
// a[myObject] = 'hello'
//通过调用数组的方式来设置属性
// a = {
//     myObject: 'hello'
// }
// console.log('a.myObject', a.myObject)


//重新构造类来修改属性
// console.log('a[myObject]', a[myObject])

// a[myObject] = 'hello'
a = {
    [myObject]: 'hello'
}
console.log('a[myObject]', a[myObject.valueOf(String)])
/**
 * []这样的方括号被称为动态属性名，这里面的值才是属性名，用于动态的属性名，而并非局限于静态的字符串，由于里面的可以是变量，可以更好的使用
 */





// const myObject = {
//     [Symbol('hiddenProperty')]: 'This is a hidden property'
// };

// console.log(myObject[Object.getOwnPropertySymbols(myObject)[0]]); // 输出: This is a hidden property


// const myArray = [1, 2, 3];
// myArray[Symbol.iterator] = function* () {
//     for (let i = 0; i < this.length; i++) {
//         yield this[i];
//     }
// };

// for (const value of myArray) {
//     console.log(value);
// }



// const Colors = {
//     RED: Symbol('RED'),
//     GREEN: Symbol('GREEN'),
//     BLUE: Symbol('BLUE')
// };

// console.log(Colors.RED); // 输出: Symbol(RED)